package com.cf.apiInstance.common.bean;

import java.io.Serializable;
import java.util.List;

import com.cf.apiInstance.common.enums.ErrorCodeEnum;

/**
 * 响应
 * 
 * @author: cf
 * @date: 28 Nov 2018 5:56:40 pm
 * @vesion: 1.0
 */
public class ApiResponse<T> implements Serializable {

	/**
	 * @Fields serialVersionUID : TODO描述
	 */

	private static final long serialVersionUID = -7533384697332771816L;

	private Integer code;

	private String msg;

	private T result;

	private List<T> datas;

	private Long timestamp;

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public T getResult() {
		return result;
	}

	public void setResult(T result) {
		this.result = result;
	}

	public List<T> getDatas() {
		return datas;
	}

	public void setDatas(List<T> datas) {
		this.datas = datas;
	}

	public Long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(Long timestamp) {
		this.timestamp = timestamp;
	}

	/**
	 * 全部自定义消息 与错误码
	 * 
	 * @param code
	 * @param message
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> error(Integer code, String message) {
		ApiResponse<T> msg = new ApiResponse<>();
		msg.msg = message;
		msg.code = code;
		return msg.putTimeStamp();
	}

	/**
	 * 全部自定义消息 与错误码
	 * 
	 * @param code
	 * @param message
	 * @param result
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> error(Integer code, String message, T result) {
		ApiResponse<T> msg = new ApiResponse<>();
		msg.msg = message;
		msg.code = code;
		msg.result = result;
		return msg.putTimeStamp();
	}

	/**
	 * 全部自定义消息 与错误码
	 * 
	 * @param code
	 * @param message
	 * @param result
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> error(Integer code, String message, List<T> datas) {
		ApiResponse<T> msg = new ApiResponse<>();
		msg.msg = message;
		msg.code = code;
		msg.datas = datas;
		return msg.putTimeStamp();
	}

	/**
	 * 时间戳
	 * 
	 * @return 返回类型 ApiResponse<T>
	 */
	private ApiResponse<T> putTimeStamp() {
		this.timestamp = System.currentTimeMillis();
		return this;
	}

	/**
	 * 系统定义的错误返回结果
	 *
	 * @param <T>
	 * @return
	 */
	public static <T> ApiResponse<T> error() {
		return error(ErrorCodeEnum.BUSINESS_FAIL.getCode(), ErrorCodeEnum.BUSINESS_FAIL.getMsg());
	}

	/**
	 * 自定义返回错误结果 默认错误码为400 业务处理失败
	 * 
	 * @param message
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> error(String message) {
		return error(ErrorCodeEnum.BUSINESS_FAIL.getCode(), message);
	}

	/**
	 * 自定义返回处理成功结果 代码为200
	 * 
	 * @param message
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> ok() {
		return error(ErrorCodeEnum.RESULT_SUCCESS.getCode(), ErrorCodeEnum.RESULT_SUCCESS.getMsg());
	}

	/**
	 * 自定义返回处理成功结果 代码为200
	 * 
	 * @param message
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> ok(String message) {
		return error(ErrorCodeEnum.RESULT_SUCCESS.getCode(), message);
	}

	/**
	 * 自定义返回处理成功结果 代码为200
	 * 
	 * @param message
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> ok(T result) {
		return error(ErrorCodeEnum.RESULT_SUCCESS.getCode(), ErrorCodeEnum.RESULT_SUCCESS.getMsg(), result);
	}

	/**
	 * 自定义返回处理成功结果 代码为200
	 * 
	 * @param message
	 * @return 返回类型 ApiResponse<T>
	 */
	public static <T> ApiResponse<T> ok(List<T> datas) {
		return error(ErrorCodeEnum.RESULT_SUCCESS.getCode(), ErrorCodeEnum.RESULT_SUCCESS.getMsg(), datas);
	}

	/**
	 * 传入对应的错误码 自动返回对应错误消息
	 * 
	 * @param code
	 * @param <T>
	 * @return
	 */
	public static <T> ApiResponse<T> error(Integer code) {
		return error(code, ErrorCodeEnum.getMsg(code));
	}
}
